#include "Escenario.h"
#include "./Objetos/Objeto.h"
#include <algorithm>
#include <iostream>


Escenario::Escenario()
{
	this->IDObjetos = 0;
	detectarImpactos = true;
}

void Escenario::noDetectarImpactos() {
	detectarImpactos = false;
}

Escenario::~Escenario(void)
{
	for (size_t i = 0; i < objetos.size();i++) delete(objetos[i]);
}

bool Escenario::detectarImpacto(Objeto *obj) {
	size_t i = 0;
	size_t count = objetos.size();
	while (i < count) {
		if (obj->detectarColisionCon(objetos[i])) return true;
		i++;
		if (count > objetos.size()) count = objetos.size();
	}
	return false;
}

void Escenario::addObjeto(Objeto *obj) {
	obj->setEscenario(this);
	mutex.lock();
	if (detectarImpactos) obj->setId(IDObjetos++);
	objetos.push_back(obj);
	mutex.unlock();
	eventoObjNuevo.emit(obj);
}

void Escenario::vivir() {
	for ( size_t i = 0; i < objetos.size() ; i++ ){
		//std::cout << "Haciendo vivir al objeto " << std::endl;
		objetos[i]->vivir();
	 }
}

void Escenario::matar(Objeto *obj) {
	if (!detectarImpactos) return;
	mutex.lock();
	objetos.erase(remove(objetos.begin(), objetos.end(), obj), objetos.end());
	short id = obj->getId();
	eventoObjDestruido.emit(id);
	mutex.unlock();
	delete(obj);
}

void Escenario::matar(short id){
	Objeto *obj;
	for (size_t i = 0; i < objetos.size();i++) {
		if (objetos[i]->getId() == id){
			obj = objetos[i];
			
			mutex.lock();
			objetos.erase(remove(objetos.begin(), objetos.end(), obj), objetos.end());
			short id = obj->getId();	
			eventoObjDestruido.emit(id);
			mutex.unlock();
			
			delete(obj);
			break;
		}
	}
}
